package com.llb666.java.collection.list;

import java.lang.reflect.Field;
import java.util.*;

/**
 * Created by 斌~
 * 2020/6/29 9:55
 */
public class ArrayListDemo {
    /**
     * ArrayList 默认数组容量为10
     * @param args 入参
     */
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        System.out.println("没有add之前数组长度："+list.size());
        System.out.println("没有add之前数组容量："+getArrayListCapacity(list));
        for (int i = 0; i < 11; i++) {
            list.add(i);
        }
        System.out.println("数组长度："+list.size());
        System.out.println("数组容量："+getArrayListCapacity(list));
        //删除不会影响数组容量
        for (int j = 10; j >=0; j--) {
            list.remove(j);
        }
        System.out.println("数组长度："+list.size());
        System.out.println("数组容量："+getArrayListCapacity(list));
    }

    /**
     * 获取 ArrayList 的数组容量
     * @param arrayList 集合
     * @return int
     */
    public static int getArrayListCapacity(List<?> arrayList) {
        Class<ArrayList> arrayListClass = ArrayList.class;
        try {
            /*
             * getField 只能获取public的，包括从父类继承来的字段。
             * getDeclaredField 可以获取本类所有的字段，包括private的，但是不能获取继承来的字段。
             * (注： 这里只能获取到private的字段，但并不能访问该private字段的值,除非加上setAccessible(true))
             */
            Field field = arrayListClass.getDeclaredField("elementData");
            field.setAccessible(true);//用反射时访问私有变量
            Object[] objects = (Object[]) field.get(arrayList);//获取arrayList的elementData值
            return objects.length;
        } catch (NoSuchFieldException | IllegalAccessException e) {
            e.printStackTrace();
            return -1;
        }
    }
}
